package com.learn.algorithm_huixing;

import java.util.HashSet;
import java.util.Set;

/**
 * 自定义矩阵的长宽，按回形打印矩阵的所有点位
 *
 * @author gatts, 2020/9/15 23:28
 */
public class BaseMatrix {

    //- 存储已存在的点位
    private static Set<String> set = new HashSet<>();

    public static void main(String[] args) {
        //- 定义矩阵的长宽
        int line = 4;
        int column = 9;
        int[][] arr = new int[line][column];
        indexMatrix(arr);
    }

    private static void indexMatrix(int[][] arr) {
        int start = 1;
        //- 矩阵的所有点位数
        int x = arr.length;
        int y = arr[0].length;
        int end = x * y;

        //- 按回字，就是 右 -> 下 -> 左-> 上 循环，分别对应1、2、3、4
        //- 循环次数，初始向右，值为1
        int direction = 1;

        int i = 0;
        int j = 0;

        for (; start <= end; start++){
            //- (0,0) (0,1) (0,2) ... (0,y)
            if (direction == 1){
                if (j < y && !existIJ(i, j)) {
                    arr[i][j] = start;
                    saveIJ(i, j);
                    j++;
                }else {
                    j--; //- 补偿操作，if中最后一次多加了
                    direction = 2; //- 打开通往下次的传送门
                    start--; //- 本次没有用到 start 的值，但是 start++了，所以执行 start--
                    i++; //- 下一步做准备
                }
            }
            else if (direction == 2){
                if ( i < x && !existIJ(i, j) ){
                    arr[i][j] = start;
                    saveIJ(i, j);
                    i++;
                }else {
                    i--;
                    direction = 3;
                    start--;
                    j--;
                }
            }
            else if (direction == 3){
                if (j > -1 && !existIJ(i, j)){
                    arr[i][j] = start;
                    saveIJ(i, j);
                    j--;
                }else {
                    j++;
                    direction = 4;
                    start--;
                    i--;
                }
            }
            else if (direction == 4){
                if (i > -1 && !existIJ(i, j)){
                    arr[i][j] = start;
                    saveIJ(i, j);
                    i--;
                }else {
                    i++;
                    direction = 1;
                    start--;
                    j++;
                }
            }
        }

        //- 验证结果
        System.out.println("-----------分割线-----------");
        for (int[] ints : arr) {
            for (int anInt : ints) {
                System.out.print(anInt + "\t");
            }
            System.out.println();
        }
    }

    private static void saveIJ(int i, int j){
        System.out.println(String.format("[%d][%d]", i, j));
        set.add(i+","+j);
    }

    private static boolean existIJ(int i, int j){
        return set.contains(i+","+j);
    }

}
